#pragma once

#include "MessageType.h"
#include "Coordinate.h"
#include "LRSInformation.h"
#include "ObjectTypes.h"
#include "PlayerInformation.h"


///////////////////////////////////////////////////////
// This should be all we need. Just need to custom build
// the message when we send it, which we have to do regardless
///////////////////////////////////////////////////////
struct Message
{
	MessageType mType;
};

struct Msg_HasCoordinate : public Message
{
	Coordinate mCoord;
};

struct Msg_HasCoordinateAndObject : public Message
{
	Coordinate mCoord;
	ObjectType mObjType;
};

struct Msg_HasCoordinateAndInt : public Message
{
	Coordinate mCoord;
	int mInteger;
};

struct Msg_HasInt : public Message
{
	int mInteger;
};

struct Msg_HasLRS : public Message
{
	LRSInformation mLRSInfo;
	Coordinate	mCoord;
};

struct Msg_HasPlayerInfo : public Message
{
	PlayerInformation mPlayerInfo;
};



///////////////////////////////////////////////////////
// These are probably unncessary
///////////////////////////////////////////////////////

struct Msg_Input_LeftClickedCoordinate : public Message
{
	// this is hte coordinate where the player clicked
	Coordinate mCoord;
};

struct Msg_Input_IncreaseBlasters : public Message
{
	// this message doesn't need any extra info
};

struct Msg_Output_LRSInformation : public Message
{
	LRSInformation LRSInfo;
};

struct Msg_Output_EnterSectorRemoveExistingObjects : public Message
{
};

struct Msg_Output_PositionPlayerShipAtCoordinate : public Message
{
	Coordinate playerPosition;
};

struct Msg_Output_CreateGameObjectAtCoordinate : public Message
{
	ObjectType objectTypeToCreate;
	Coordinate objectPosition;
};

struct Msg_Output_DestroyGameObjectAtCoordinate : public Message
{
	ObjectType objectTypeToDestroy;
	Coordinate objectPosition;
};

struct Msg_Output_EnemyEnabledCombatModeAtCoordinate : public Message
{
	Coordinate enemyPosition;
};

struct Msg_Output_EnemyShipDamagedAtCoordinate : public Message
{
	int enemyHealthRemaining;
	Coordinate enemyPosition;
};

struct Msg_Output_EnemyShipConsumedEnergyAtCoordinate : public Message
{
	int enemyEnergyRemaining;
	Coordinate enemyPosition;
};

struct Msg_Output_MovedPlayerTookDamageAtCoordinate : public Message
{
	int damage;
	Coordinate damagePosition;
};

//struct Msg_Output_MovedPlayerTookDamageAtCoordinate : public Message
//{
//	int damage;
//	Coordinate damagePosition;
//};

struct Msg_Output_PlayerDockedAtCoordinate : public Message
{
	Coordinate dockPosition;
};

struct Msg_Output_SetPlayerStatus : public Message
{
	PlayerInformation playerStatus;
};

struct Msg_Output_MovedShieldsWereDrained : public Message
{
	int amountDrained;
};

struct Msg_Output_MovedBlastersWereDrained : public Message
{
	int amountDrained;
};

struct Msg_Output_AttackedBlastersWereDrained : public Message
{
	int amountDrained;
};

struct Msg_Output_AttackedReservesWereDrained : public Message
{
	int amountDrained;
};

struct Msg_Error_CannotMoveThere : public Message
{
	int amountDrained;
};
